const authService = require('../services/auth.service');
const userService = require('../services/user.service');
const { success, error } = require('../utils/response');

/**
 * 用户登录
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
exports.login = async (req, res, next) => {
  try {
    const { username, password } = req.body;
    
    // 验证请求数据
    if (!username || !password) {
      return res.status(400).json(error('用户名和密码不能为空', 400));
    }
    
    // 调用登录服务
    const result = await authService.login(username, password);
    
    res.json(success(result, '登录成功'));
  } catch (err) {
    // 处理特定错误
    if (err.message === '用户不存在' || err.message === '密码错误') {
      return res.status(401).json(error('用户名或密码错误', 401));
    }
    
    if (err.message === '账户已被禁用') {
      return res.status(403).json(error('账户已被禁用', 403));
    }
    
    next(err);
  }
};

/**
 * 用户注册
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
exports.register = async (req, res, next) => {
  try {
    const userData = req.body;
    
    // 验证请求数据
    if (!userData.username || !userData.email || !userData.password) {
      return res.status(400).json(error('用户名、邮箱和密码不能为空', 400));
    }
    
    // 调用注册服务
    const result = await authService.register(userData);
    
    res.status(201).json(success(result, '注册成功', 201));
  } catch (err) {
    // 处理特定错误
    if (err.message === '用户名已被使用') {
      return res.status(400).json(error('用户名已被使用', 400));
    }
    
    if (err.message === '邮箱已被使用') {
      return res.status(400).json(error('邮箱已被使用', 400));
    }
    
    next(err);
  }
};

/**
 * 用户登出
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
exports.logout = async (req, res, next) => {
  try {
    const userId = req.user.id;
    
    // 调用登出服务
    await authService.logout(userId);
    
    res.json(success(null, '登出成功'));
  } catch (err) {
    next(err);
  }
};

/**
 * 刷新令牌
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
exports.refreshToken = async (req, res, next) => {
  try {
    const { token } = req.body;
    
    if (!token) {
      return res.status(400).json(error('令牌不能为空', 400));
    }
    
    // 调用刷新令牌服务
    const result = await authService.refreshToken(token);
    
    res.json(success(result, '刷新令牌成功'));
  } catch (err) {
    res.status(401).json(error('刷新令牌失败', 401));
  }
};

/**
 * 验证令牌
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
exports.verifyToken = async (req, res, next) => {
  try {
    const { token } = req.body;
    
    if (!token) {
      return res.status(400).json(error('令牌不能为空', 400));
    }
    
    // 调用验证令牌服务
    const decoded = await authService.verifyToken(token);
    
    res.json(success({ valid: true, user: decoded }, '令牌验证成功'));
  } catch (err) {
    res.json(success({ valid: false }, '令牌验证失败'));
  }
}; 